#pragma  once
#include <string>
#include <unordered_map>

namespace rpc
{
    //请求字段宏定义
    #define KEY_METHOD "method" //rpc方法的名称
    #define KEY_PARAMS "paraments" //rpc方法的参数
    #define KEY_TOPIC_KEY "topic_key" //主题名称
    #define KEY_TOPIC_MSG "topic_msg"//主题内容
    #define KEY_OPTYPE "optype"//主题/服务操作类型
    #define KEY_HOST "host"//主机
    #define KEY_HOST_IP "ip"//主机IP
    #define KEY_HOST_PORT "port"//主机端口
    #define KEY_RCODE "rcode"//响应状态码
    #define KEY_RESULT "result"//rpc响应结果

    //消息类型定义
    enum class MType
    {
        REQ_RPC=0,//Rpc请求
        RSP_RPC,//Rpc响应
        REQ_TOPIC,//主题请求
        RSP_TOPIC,//主题响应
        REQ_SERVICE,//服务请求
        RSP_SERVICE//服务响应
    };

    //响应码类型定义
    enum class RCode
    {
        RCODE_OK = 0,//成功处理
        RCODE_PARSE_FAILED,//解析失败
        RCODE_INVALID_MSG,//消息中字段缺失或错误导致无效消息
        RCODE_DISCONNECTED,//连接断开
        RCODE_INVALID_PARAMS,//无效的Rpc调用参数
        RCODE_NOT_FOUND_SERVICE,//Rpc服务不存在
        RCODE_INVALID_OPTYPE,//无效的操作类型
        RCODE_NOT_FOUND_TOPIC,//主题不存在
        RCODE_INTERNAL_ERROR//内部错误
    };

    //映射响应状态码的原因
    static std::string errReason(RCode code)
    {
        static std::unordered_map<RCode,std::string> err_map = 
        {
            {RCode::RCODE_OK,"成功处理"},
            {RCode::RCODE_PARSE_FAILED,"消息解析失败"},
            {RCode::RCODE_INVALID_MSG,"无效消息"},
            {RCode::RCODE_DISCONNECTED,"链接已断开"},
            {RCode::RCODE_INVALID_PARAMS,"无效RPC参数"},
            {RCode::RCODE_NOT_FOUND_SERVICE,"没有找到对应的服务"},
            {RCode::RCODE_INVALID_OPTYPE,"无效的操作类型"},
            {RCode::RCODE_NOT_FOUND_TOPIC,"没有找到对应的主题"},
            {RCode::RCODE_INTERNAL_ERROR,"内部错误"}
        };
        std::unordered_map<RCode,std::string>::iterator iter = err_map.find(code);
        if(iter == err_map.end())
        {
            return "未知错误";
        }
        return iter->second;
    }

    //RPC请求类型定义
    enum class RType
    {
        REQ_ASYNC=0,//异步请求：返回异步对象，在需要的时候通过异步对象获取响应结果（还未收到结果会阻塞）
        REQ_CALLBACK//回调请求：设置回调函数，通过回调函数对响应进⾏处理
    };

    //主题操作类型定义
    enum class TopicOptype
    {
        TOPIC_CREATE=0,//主题创建
        TOPIC_REMOVE,//主题删除
        TOPIC_SUBSCRIBE,//主题订阅
        TOPIC_CANCEL,//主题取消订阅
        TOPIC_PUBLISH//主题消息发布
    };

    //服务操作类型定义
    enum class ServiceOptype
    {
        SERVICE_REGISTRY,//服务注册
        SERVICE_DISCOVERY,//服务发现
        SERVICE_ONLINE,//服务上线
        SERVICE_OFFLINE,//服务下线
        SERVICE_UNKNOW //未知服务
    };
}